CC = gcc
LD = gcc
AS = gcc
RM = rm

CFLAGS = -I. -O0
SFLAGS = -S
LDADD=-lm
SOURCES=tp1.c matrix.c
OBJS=tp1.o matrix.o
GENERIC_OBJS=generic/estimar.o generic/estimador_media.o generic/estimador_varianza.o
CLEANBINS=tp1
CLEANOBJS=$(OBJS)

all: from_asm

.c.o:
	$(CC) $(CFLAGS) -c $< -o $@

.S.o:
	$(CC) $(CFLAGS) -c $< -o $@

generic: $(OBJS) $(GENERIC_OBJS) 
	$(LD) $(LDADD) $(OBJS) $(GENERIC_OBJS) -o tp1
	
asm_i:
	$(CC) $(SFLAGS) $(CFLAGS) $(ASMOPT) generic/estimar.c -o $(TARGET_ARCH)/estimar.S
	$(CC) $(SFLAGS) $(CFLAGS) $(ASMOPT) generic/estimador_media.c -o $(TARGET_ARCH)/estimador_media.S
	$(CC) $(SFLAGS) $(CFLAGS) $(ASMOPT) generic/estimador_varianza.c -o $(TARGET_ARCH)/estimador_varianza.S

from_asm_i: $(OBJS) $(TARGET_ARCH)/estimar.o $(TARGET_ARCH)/estimador_media.o $(TARGET_ARCH)/estimador_varianza.o
	$(LD) $(LDADD) $(OBJS) $(TARGET_ARCH)/estimar.o $(TARGET_ARCH)/estimador_media.o $(TARGET_ARCH)/estimador_varianza.o -o tp1


asm:
	@TARGET_ARCH=`uname -m` make asm_i

from_asm:
	@TARGET_ARCH=`uname -m` make from_asm_i

help:
	@echo Uso
	@echo
	@echo -e make help\\tmuestra esta ayuda
	@echo -e make generic\\tconstruye a partir del codigo fuente C
	@echo -e make from_asm\\tconstruye a partir del codigo ensamblador especifico para la arquitectura
	@echo -e make clean\\telimina los binarios y objetos construidos
	@echo -e make asm\\tgenera codigo ensamblador especifico para la arquitectura a partir del codigo C generico
	@echo
	@echo NOTA: Para from_asm y asm puede especificarse la arquitectura, de no especificarse se detectara automaticamente. Ejemplos:
	@echo
	@echo \#\> 'make asm'
	@echo \#\> 'TARGET_ARCH=x86_64 make asm'
	@echo \#\> 'TARGET_ARCH=pmax make asm'
	@echo

clean:
	@-$(RM) $(CLEANBINS) $(CLEANOBJS) pmax/*.o x86_64/*.o generic/*.o || true
	
